#include <iostream>

template<typename T>
class LinkedList {
private:
    struct Node {
        T data;
        Node* next;
        
        // 使用参数包构造T对象 如果遇到了 默认构造被禁止掉的类呢，就只能这样了
        template<typename... Args>
        Node(Args&&... args) : data(std::forward<Args>(args)...), next(nullptr) {}
    };

    Node* head;  // 指向链表第一个节点的指针
    Node* tail;  // 指向链表最后一个节点的指针
    size_t size; // 链表中元素的个数
    
public:
    // 使用参数包的插入方法
    template<typename... Args>
    void emplace_front(Args&&... args) {
        Node* newNode = new Node(std::forward<Args>(args)...);
        newNode->next = head;
        head = newNode;
        ++size;
    }
    
    template<typename... Args>
    void emplace_back(Args&&... args) {
        Node* newNode = new Node(std::forward<Args>(args)...);
        tail->next = newNode;
        tail = newNode;
        ++size;
    }
    
    // 保留传统的push方法
    template<typename U>
    void push_front(U&& value) {
        emplace_front(std::forward<U>(value));
    }
    
    template<typename U>
    void push_back(U&& value) {
        emplace_back(std::forward<U>(value));
    }

    size_t lsize() { return size; }
};

int main()
{
    return 0;
}